// 使用new运算符后发生的事情
// 1.创建一个新对象
// 2.将这个新对象的原型指向构造函数的原型
// 3.改变this指向
// 4.对构造函数做返回值判断(基本数据类型则忽略, 返回引用数据类型)

function Fun(age, name) {
  this.age = age
  this.name = name
}

function create(fn, ...args) {
  // 1.创建一个新对象
  let obj = {}
  // 2.将这个新对象的原型指向构造函数的原型
  Object.setPrototypeOf(obj, fn.prototype)
  //obj.__proto__ = fn.prototype
  // 3.改变this指向
  let result = fn.apply(obj, args)
  // 4.对构造函数做返回值判断(基本数据类型则忽略, 返回引用数据类型)
  return result instanceof Object ? result : obj
}

let obj = create(Fun, 18, 'zs')
let obj1 = new Fun(19, 'ls')
console.log(obj)
console.log(obj1)
